#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
bool st[N];
int n;
 int ret=INT_MAX;
struct edge
{
    int to;
    int w;
    int next;
}edges[2*N];
int count_edge;
int head[N];

void init()
{
    memset(head,-1,sizeof(head));

}
void add(int u,int v,int w)
{
    int h=head[u];//第一条边
    //进行头部插入
    edges[count_edge].next=h;
    head[u]=count_edge;
    edges[count_edge].to=v;
    edges[count_edge].w=w;
    count_edge++;
}
//该函数返回的是根为u节点的数量
//该dfs不仅记录了u节点的size
//并且在返回之前可以跟新一下结果
int dfs(int u)
{   
    st[u]=true;
    int sum=1,maxret=0;
    for(int i=head[u];i!=-1;i=edges[i].next)
    {
        int nextnode=edges[i].to;
        if(!st[nextnode])
        {
            st[nextnode]=true;
            int sizepart=dfs(nextnode);
            maxret=max(maxret,sizepart);
            sum+=sizepart;
        }
    }
    //更新父节点说在联通块的大小数量
    maxret=max(maxret,n-sum);
    ret=min(maxret,ret);
    return sum;
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    init();
    cin>>n;
    for(int i=0;i<n-1;i++)
    {
        int u,v;
        cin>>u>>v;
        add(u,v,1);
        add(v,u,1);
    }
    dfs(1);
    cout<<ret<<endl;
    return 0;
}